#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <time.h>

using namespace std;

#define THREAD_NUM 3

int n = 1000;

void* threadRun(void* arg)
{
    while (true)
    {
        if (n > 0)
        {
            usleep(rand() % 1500);
            cout << (char*)arg << "线程抢到一张票啦" << n << endl;
            n--;  // 访问修改共享资源
        }
        else break;
        usleep(rand() % 2000);  // 模拟执行其他任务
    }
    return nullptr;
}

int main()
{
    srand((unsigned long)time(nullptr));
    pthread_t tid[THREAD_NUM];
    string ar[THREAD_NUM];
    for (int i = 0; i < THREAD_NUM; ++i)
    {
        ar[i] = "thread-";
        ar[i] += to_string(i + 1);
        pthread_create(tid + i, nullptr, threadRun, (void*)ar[i].c_str());
    }

    // 主线程阻塞等待新线程
    for (int i = 0; i < THREAD_NUM; ++i)
    {
        pthread_join(tid[i], nullptr);
    }
    return 0;
}

// void* threadRun(void* arg)
// {
//     pthread_detach(pthread_self());  // 一般是自己分离自己
//     for (int i = 0; i < 3; ++i)
//     {
//         cout << "新线程执行任务j-" << i + 1 << endl;
//         sleep(1);
//     }
//     cout << "子线程退出" << endl;
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, nullptr);
//     // pthread_detach(tid);  // 可以主线程进行分离
//     for(int i = 0; i < 12; ++i)
//     {
//         cout << "主线程执行任务" << i + 1 << endl;
//         sleep(1);
//     }
//     return 0;
// }

// void* threadRun(void* arg)
// {
//     sleep(1);
//     cout << "子线程等待3s执行ls -l 命令" << endl;
//     sleep(3);
//     execlp("ls", "ls", "-l", nullptr);  // 进程替换函数 从库目录下进行搜索
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, nullptr);
//     for(int i = 0; i < 12; ++i)
//     {
//         cout << "主线程执行任务" << i + 1 << endl;
//         sleep(1);
//     }
//     pthread_join(tid, nullptr);  // 线程等待
//     return 0;
// }

// __thread int val = 6;

// void* threadRun(void* arg)
// {
//     cout << pthread_self() << "线程看到的全局变量大小为val:" << val << endl;  // 6;
//     val++;  // 线程内进行修改
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     val--;
//     pthread_create(&tid, nullptr, threadRun, nullptr);
//     pthread_join(tid, nullptr);  // 线程等待
//     cout << pthread_self() << "主线程现在看到的全局变量大小为val:" << val << endl;  // 5
//     return 0;
// }